package com.example.template;

// 抽象类的应用: 模板方法的设计模式
public class TemplateMethod {
    public static void main(String[] args) {
        BankTemplateMethod btm = new DrawMoney();
        btm.process();
        System.out.println("----------------------");
        BankTemplateMethod btm2 = new ManageMoney();
        btm2.process();
    }
}

abstract class BankTemplateMethod {
    // 具体方法
    public void taskNumber() {
        System.out.println("取号排队");
    }

    // 办理具体业务 钩子方法
    public abstract void transact();

    public void evaluate() {
        System.out.println("反馈评分");
    }

    // 模板方法，把基本操作组合在一起，子类一般不能重写
    public final void process() {
        this.taskNumber();

        // 像个钩子，具体执行时，挂那个子类，就执行那个子类的实现代码
        this.transact();

        this.evaluate();
    }
}

class DrawMoney extends BankTemplateMethod {

    @Override
    public void transact() {
        System.out.println("我要取款");
    }
}

class ManageMoney extends BankTemplateMethod {

    @Override
    public void transact() {
        System.out.println("我要理财!我这里有2000万美元!");
    }
}
